# -*- coding: utf-8 -*-
# Función de lanzamiento y reinicio de la aplicación.

## vipera, un diseñador de aplicaciones para Python
##     Copyright (C) 2011 Ángel Luis García García
##
##    This program is free software: you can redistribute it and/or modify
##    it under the terms of the GNU General Public License as published by
##    the Free Software Foundation, either version 3 of the License, or
##    (at your option) any later version.
##
##    This program is distributed in the hope that it will be useful,
##    but WITHOUT ANY WARRANTY; without even the implied warranty of
##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##    GNU General Public License for more details.
##
##    You should have received a copy of the GNU General Public License
##    along with this program.  If not, see <http://www.gnu.org/licenses/>.

# [08-05-2011] vipera: UN IDE PARA DESARROLLAR EN PYTHON

import os
import random
import sys

# Comprobamos versión de wxPython.
try:
    WX_VERSION  = '2.8'
    import wxversion
    wxversion.ensureMinimal(WX_VERSION)
except ImportError:
    print 'Se necesita wxPython v%s para lanzar vipera'% WX_VERSION
    sys.exit()

import wx
import wx.lib.ogl as ogl
import wx.lib.agw.pybusyinfo as PBI

from frontend_vipera import fp
from configuracion_vipera import conf_vipera, proy_por_defecto, enter
from i18n_vipera import t, ENGLISH, SPANISH

licencia = u'''
vipera, an application designer for Python
    Copyright (C) 2011 Angel Luis Garcia Garcia
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
'''

# Texto de información de consola.
info = u'''
--help Esta ayuda (This help).
-r     Reinicializar configuración (Restart configuration).
-en    Iniciar aplicación en inglés (Start application in English language).
-l     Licencia (License).
'''

def Main(reinicio = False):
    '''Función principal de lanzamiento de aplicación wxPython.'''
    # Comprobamos versión de Python.
    version = sys.version_info
    if version[0] != 2:
        try:
            print("Se necesita Python 2.6 o 2.7 para lanzar vipera")
        except: pass
        return
    if version[1] < 6:
        try:
            print("Se necesita Python >= 2.6 para lanzar vipera")
        except: pass
        return
    # Por defecto el idioma en español.
    idioma = SPANISH
    # Instanciación de la aplicación wxPython.
    app = wx.PySimpleApp()
    # wxPython también en español.
    wx.Locale(wx.LANGUAGE_SPANISH)
    # Si no se reinicia hay que comprobar parámetros de entrada.
    if not reinicio:
        # Opciones de lanzamiento de la aplicación.
        if len(sys.argv) > 1:
            # Eliminamos fichero de configuración de la aplicación.
            if '-r' in sys.argv[1:]:
                try:
                    os.remove(proy_por_defecto['nfich_conf'])
                except: 
                    print u"El fichero de configuración no existe o no se puede eliminar. Continuando la carga..."
            # Iniciamos la aplicación en inglés.
            if '-en' in sys.argv[1:]:
                idioma = ENGLISH
            # Ayuda de la aplicación.
            if sys.argv[1] in ['--help', '-h', '-H', '?', '/?', '-help', '--h', '--H']:
                msj = '%s %s %s%s%s' % (proy_por_defecto['NOMBRE_APLIC'], 
                                      proy_por_defecto['VERSION'],
                                      t(proy_por_defecto['FECHA_CREACION'],idioma),  
                                      enter * 2, info)
                print msj
                sys.exit(0)
            # Mostramos licencia.
            if sys.argv[1] in ['-l', '--l', '--license', '-license']:
                print licencia
                sys.exit(0)
    # Configuración de la aplicación.
    conf_vipera_p = conf_vipera()
    try:
        conf_vipera_p.abrir_fichero()
    except:
        msj = t(u'No se puede abrir el fichero de configuración',1)
        wx.MessageBox(msj, t(u"Atención",1), wx.OK)
        del app
        return False
    datos_conf = conf_vipera_p.recuperar_datos()
    # Idioma...
    if idioma == SPANISH and datos_conf['idioma'] == 'English':
        idioma = ENGLISH
        wx.Locale(wx.LANGUAGE_ENGLISH)
    if idioma == ENGLISH and datos_conf['idioma'] == u'Español':
        idioma = ENGLISH
        wx.Locale(wx.LANGUAGE_ENGLISH)
    # Mensaje de inicio...
    mensaje = t(u"Inicializando vipera...",idioma)
    busy = PBI.PyBusyInfo(mensaje, parent=None, title=t("Un momento...",idioma))
    wx.Yield()
    # Inicializamos el OGL.
    ogl.OGLInitialize()
    # Instanciamos frontend de la aplicación.
    f1 = fp(datos_conf, idioma)
    # Mostramos el frame.
    f1.Show()
    # Eliminamos mensaje de inicio.
    del busy
    # Mostramos consejos de inicio...
    if datos_conf['activar_tips']:
        fichero = os.path.realpath(proy_por_defecto['fich_tips'])
        # Número de líneas.
        try:
            f = open(fichero,'r')
            nlineas = len(f.readlines())
            f.close()
        except: nlineas = 0
        # Número al azar entre el total de líneas.
        numero = int(random.uniform(1,nlineas))
        # Creamos mensaje de consejos.
        tp = wx.CreateFileTipProvider(os.path.realpath(fichero), numero)
        # Y lo mostramos...
        showTip = wx.ShowTip(f1, tp, True)
    else: showTip = False
    # Guardamos el cambio de estado.
    f1.conf_vipera.m_checkBox_tips.Set3StateValue(showTip)
    # Si el idioma es diferente al español habrá que cambiar en todos los widgets.
    if idioma == ENGLISH: f1.conf_vipera.m_choice_idioma.SetStringSelection('English')
    if idioma == SPANISH: f1.conf_vipera.m_choice_idioma.SetStringSelection('Español')
    # Creamos fichero de log del día.
    fichero_log = proy_por_defecto['fichero_log']
    # Redireccionamos salida y errores de la aplicación al fichero log.
    app.RedirectStdio(fichero_log)
    # ¡Y esperamos a los eventos!.
    app.MainLoop()
    # Comprobamos si hay que reiniciar la aplicación.
    if os.path.exists(proy_por_defecto['file_restart_app']):
        try:
            # Eliminamos fichero.
            os.remove(proy_por_defecto['file_restart_app'])
            # Llamamos a la función con flag de reinicio activado.
            Main(True)
        except:
            msj = t(u'No se pudo reiniciar. Elimine manualmente el fichero ', idioma) + \
                proy_por_defecto['file_restart_app']
            wx.MessageBox(msj, t(u'Atención', idioma))
